package cn.zgwj.basic.service.impl;

import cn.zgwj.basic.constant.BaseConstants;
import cn.zgwj.basic.exception.BusinessException;
import cn.zgwj.basic.service.IVerifyCodeService;
import cn.zgwj.basic.util.StrUtils;
import cn.zgwj.user.domain.User;
import cn.zgwj.user.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.Map;
import java.util.concurrent.TimeUnit;

@Service
public class VerifyCodeServiceImpl implements IVerifyCodeService {

    @Autowired
    private UserMapper userMapper;
    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public void sendSmsCode(Map<String,String> params) {
        String phone = params.get("phone");
        String type = params.get("type");

//        1.校验
//        1.1 手机号不能为空 phone
        if(StringUtils.isEmpty(phone) || StringUtils.isEmpty(type)){
            throw new BusinessException("手机号不能为空!!!!");
        }
        String businessKey = "";
        if("register".equals(type)){//手机号注册
            //        1.2 手机号不能被注册, 报错 查询 t_user
            User user = userMapper.loadByPhone(phone);
            if (user != null) {
                throw new BusinessException ("用户已存在,请直接登录!!!");
            }
            businessKey = BaseConstants.BUSINESS_REGISTER_PREFIX + phone;
        }else if("binder".equals(type)){//绑定微信
            businessKey = BaseConstants.BUSINESS_BINDER_PREFIX + phone;
        }
        sendCode(businessKey);
    }

    /**
     * 真正的发送验证码
     * @param businessKey
     */
    public void sendCode(String businessKey){
        //        2.查看验证码是否有效   是否过了3分钟  key business_register:159
        String key = businessKey;
        Object codeValueTmp = redisTemplate.opsForValue().get(key);
//        2.1 如果没有过期    value 9527:1346489765465
        String code = "";
        if(codeValueTmp != null){//没有过三分钟
            Long oldTime = Long.valueOf(((String)codeValueTmp).split(":")[1]);// 1346489765465
//        2.1.1 判断是否过了1分钟重发时间 1 *60 * 1000
            if(System.currentTimeMillis() - oldTime <= 1 * 60 * 1000){
//        2.1.1.1 如果没过, 使劲骂....
                throw new BusinessException("少年;郎,你还年轻!");
            }
//        2.1.1.2 如果过了 (过了1分钟,还没到3分钟,使用还没过期的验证码)=== code  9527
            code = ((String)codeValueTmp).split(":")[0];//使用上一次还没过期的
        }else{
//        2.2 如果过期了(或者是第一次来)
//        2.2.1 直接生成新的验证码   ===  code
            code = StrUtils.getComplexRandomString(4);//生成新的
        }
//        3.保存验证码到redis 直接设置3分钟过期就ok了
//        key   business_register:159
//        value 9527:1346489765465
        String codeVal = code + ":" + System.currentTimeMillis();
        redisTemplate.opsForValue().set(
                key,
                codeVal,
                3,
                TimeUnit.MINUTES  //单位 分钟
        );
//        4.调用SmsUtils发送短信给客人
        //SmsUtils.sendSms(phone, "您的验证码是:"+code+",请在三分钟内使用!!");
        System.out.println("您的验证码是:" + code + ",请在三分钟内使用!!");

    }
}
